package com.silences.dao;

//dao 叫 数据访问层

import com.silences.pojo.User;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

// userdao 处理user表的访问
public class UserDao {

    //添加用户
    public void addUser(User u) throws SQLException, ClassNotFoundException {//throws SQLException 抛出异常

        //mysql 8.0
        //String url="jdbc:mysql://localhost:3306/db_student?characterEncoding=utf-8"+
        // "&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL="false";


        //1 获取数据库连接
        // 加载驱动器
        Class.forName("com.mysql.jdbc.Driver");//5.0版本
        // Class.forName("com.mysql.cj.jdbc.Driver");//8.0版本
        //mysql 5.0 版本
        String url="jdbc:mysql://localhost:3306/db_student?characterEncoding=utf-8"; //localhost 是数据库的主机名和Ip地址 3306是MySQL的默认端口号 后面是要连接的数据库名称 ?characterEncoding=utf-8是一个用于设置数据库连接字符集编码的参数
        String user="root";//账号
        String password="123456";//密码
        Connection conn= DriverManager.getConnection(url,user,password);

        //1 编辑sql语句
        String sql="insert into user values (null,?,?,?,?)";
        //2 使用preparement 执行sql语句
        PreparedStatement ps=conn.prepareStatement(sql);
        //3 设置参数，替换我们的问号
        ps.setString(1,u.getUsername());
        ps.setString(2,u.getPassword());
        ps.setString(3,u.getAvatar());
        //util 形式的日期 转为sql 形式日期， getTime（）获取毫秒数
        ps.setDate(4,new java.sql.Date(u.getCreatedate().getTime()));
        //4 执行
        ps.executeLargeUpdate();// ps.executeLargeUpdate()执行添加，删除和修改
        //5 关闭资源
        conn.close();
        ps.close();
    }

    //查询用户列表
    public List<User> getUser(String searchname,String pageIndex, String pageSize) throws SQLException, ClassNotFoundException {//throws SQLException 抛出异常

        //mysql 8.0
        //String url="jdbc:mysql://localhost:3306/db_student?characterEncoding=utf-8"+
        // "&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL="false";


        //1 获取数据库连接
        // 加载驱动器
        Class.forName("com.mysql.jdbc.Driver");//5.0版本
        // Class.forName("com.mysql.cj.jdbc.Driver");//8.0版本
        //mysql 5.0 版本
        String url="jdbc:mysql://localhost:3306/db_student?characterEncoding=utf-8"; //localhost 是数据库的主机名和Ip地址 3306是MySQL的默认端口号 后面是要连接的数据库名称 ?characterEncoding=utf-8是一个用于设置数据库连接字符集编码的参数
        String user="root";//账号
        String password="123456";//密码
        Connection conn= DriverManager.getConnection(url,user,password);

        //1 编辑sql语句
        //String sql="select *from user ";
        //分页sql
        String sql="select * from user limit ?,?";
        if(searchname !=null && searchname !="") {
         sql="select *from user where username=? limit ?,?";
        }
        //2 使用prepareStatement 执行sql语句
        PreparedStatement ps =conn.prepareStatement(sql);
        //3  设置参数，替代问号，没有问号可以省略
        int pi=Integer.parseInt(pageIndex);
        int size=Integer.parseInt(pageSize);
        if(searchname !=null && searchname !=""){
            ps.setString(1,searchname);
            ps.setInt(2,(pi-1)*size);
            ps.setInt(3,size);
        }else
        {
            ps.setInt(1,(pi-1)*size);
            ps.setInt(2,size);
        }

        //2 使用preparement 执行sql语句
        //PreparedStatement ps =conn.prepareStatement(sql);
        //3 设置参数，替换我们的问号

        //4 执行  会返回一个结果集
         ResultSet rs=ps.executeQuery();
         // 5 处理结果集
        List<User> list=new ArrayList<User>(); // 创建list集合 ， 装用户对象
        while(rs.next())
        {
            User u =new User();// 导包操作 import class
            u.setId(rs.getInt(1));
            u.setUsername(rs.getString(2));
            u.setPassword(rs.getString(3));
            u.setAvatar(rs.getString(4));
            u.setCreatedate(rs.getDate(5));
            list.add(u);//把用户对象添加到list集合里面
        }
        //6 关闭资源
        conn.close();
        ps.close();
        rs.close();
        return list;
    }

     //根据单个id
    //查询用户列表
    public User getUserById(int id) throws SQLException, ClassNotFoundException {//throws SQLException 抛出异常

        //mysql 8.0
        //String url="jdbc:mysql://localhost:3306/db_student?characterEncoding=utf-8"+
        // "&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL="false";


        //1 获取数据库连接
        // 加载驱动器
        Class.forName("com.mysql.jdbc.Driver");//5.0版本
        // Class.forName("com.mysql.cj.jdbc.Driver");//8.0版本
        //mysql 5.0 版本
        String url="jdbc:mysql://localhost:3306/db_student?characterEncoding=utf-8"; //localhost 是数据库的主机名和Ip地址 3306是MySQL的默认端口号 后面是要连接的数据库名称 ?characterEncoding=utf-8是一个用于设置数据库连接字符集编码的参数
        String user="root";//账号
        String password="123456";//密码
        Connection conn= DriverManager.getConnection(url,user,password);

        //1 编辑sql语句
        String sql="select *from user where id=?";
        //2 使用preparement 执行sql语句
        PreparedStatement ps=conn.prepareStatement(sql);
        //3 设置参数，替换我们的问号
        ps.setInt(1,id);
        //4 执行  会返回一个结果集
        ResultSet rs=ps.executeQuery();
        // 5 处理结果集
        List<User> list=new ArrayList<User>(); // 创建list集合 ， 装用户对象

        User u =new User();
        while(rs.next())
        {
            //User u =new User();// 导包操作 import class
            u.setId(rs.getInt(1));
            u.setUsername(rs.getString(2));
            u.setPassword(rs.getString(3));
            u.setAvatar(rs.getString(4));
            u.setCreatedate(rs.getDate(5));
            //list.add(u);//把用户对象添加到list集合里面
        }
        //6 关闭资源
        conn.close();
        ps.close();
        rs.close();
        return u;
    }



    //总条数的查询
    //查询商品列表
    public int countUsers(String searchname) throws SQLException, ClassNotFoundException {//throws SQLException 抛出异常

        //mysql 8.0
        //String url="jdbc:mysql://localhost:3306/db_student?characterEncoding=utf-8"+
        // "&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL="false";


        //1 获取数据库连接
        // 加载驱动器
        Class.forName("com.mysql.jdbc.Driver");//5.0版本
        // Class.forName("com.mysql.cj.jdbc.Driver");//8.0版本
        //mysql 5.0 版本
        String url="jdbc:mysql://localhost:3306/db_student?characterEncoding=utf-8"; //localhost 是数据库的主机名和Ip地址 3306是MySQL的默认端口号 后面是要连接的数据库名称 ?characterEncoding=utf-8是一个用于设置数据库连接字符集编码的参数
        String user="root";//账号
        String password="123456";//密码
        Connection conn= DriverManager.getConnection(url,user,password);

        //1 编辑sql语句
        //String sql="select *from user ";
        //分页sql
        String sql="select count(*) from user s ";
        if(searchname !=null && searchname !="") {
            sql="select count(*) from user where username= ? ";
        }
        //2 使用prepareStatement 执行sql语句
        PreparedStatement ps =conn.prepareStatement(sql);
        //3  设置参数，替代问号，没有问号可以省略
        if(searchname !=null && searchname !=""){
            ps.setString(1,searchname);

        }
        //4 执行  会返回一个结果集
        ResultSet rs=ps.executeQuery();
        // 5 处理结果集
        int count=0;
        while(rs.next())
        {
            count =rs.getInt(1);
        }
        //6 关闭资源
        conn.close();
        ps.close();
        rs.close();
        return count;
    }



    //修改用户
    public void updateUser(User u) throws SQLException, ClassNotFoundException {//throws SQLException 抛出异常

        //mysql 8.0
        //String url="jdbc:mysql://localhost:3306/db_student?characterEncoding=utf-8"+
        // "&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL="false";


        //1 获取数据库连接
        // 加载驱动器
        Class.forName("com.mysql.jdbc.Driver");//5.0版本
        // Class.forName("com.mysql.cj.jdbc.Driver");//8.0版本
        //mysql 5.0 版本
        String url="jdbc:mysql://localhost:3306/db_student?characterEncoding=utf-8"; //localhost 是数据库的主机名和Ip地址 3306是MySQL的默认端口号 后面是要连接的数据库名称 ?characterEncoding=utf-8是一个用于设置数据库连接字符集编码的参数
        String user="root";//账号
        String password="123456";//密码
        Connection conn= DriverManager.getConnection(url,user,password);//DriverManager 是 Java 中用于管理 JDBC 驱动程序的类负责加载驱动程序、建立数据库连接并提供对数据库的访问

        //1 编辑sql语句
        String sql="update user set username=?,password=?, avatar=?,createdate=? where id=?";
        //2 使用preparement 执行sql语句
        PreparedStatement ps=conn.prepareStatement(sql);
        //3 设置参数，替换我们的问号
        ps.setString(1,u.getUsername());
        ps.setString(2,u.getPassword());
        ps.setString(3,u.getAvatar());
        ps.setDate(4,new java.sql.Date(u.getCreatedate().getTime()));
        ps.setInt(5,u.getId());
        //4 执行
        ps.executeUpdate();// ps.executeLargeUpdate()执行添加，删除和修改
        //5 关闭资源
        conn.close();
        ps.close();
    }

    //删除用户
    public void deleteUser(int id) throws SQLException, ClassNotFoundException {//throws SQLException 抛出异常

        //mysql 8.0
        //String url="jdbc:mysql://localhost:3306/db_student?characterEncoding=utf-8"+
        // "&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL="false";


        //1 获取数据库连接
        // 加载驱动器
        Class.forName("com.mysql.jdbc.Driver");//5.0版本
        // Class.forName("com.mysql.cj.jdbc.Driver");//8.0版本
        //mysql 5.0 版本
        String url="jdbc:mysql://localhost:3306/db_student?characterEncoding=utf-8"; //localhost 是数据库的主机名和Ip地址 3306是MySQL的默认端口号 后面是要连接的数据库名称 ?characterEncoding=utf-8是一个用于设置数据库连接字符集编码的参数
        String user="root";//账号
        String password="123456";//密码
        Connection conn= DriverManager.getConnection(url,user,password);

        //1 编辑sql语句
        String sql="delete from user where id=?";
        //2 使用preparement 执行sql语句
        PreparedStatement ps=conn.prepareStatement(sql);
        //3 设置参数，替换我们的问号
        ps.setInt(1,id);

        //4 执行
        ps.executeLargeUpdate();// ps.executeLargeUpdate()执行添加，删除和修改
        //5 关闭资源
        conn.close();
        ps.close();
    }

    public static void main(String[] args) throws SQLException, ClassNotFoundException {
       UserDao u= new UserDao();
       //添加 u.addUser();
       //方法调用 变量名.方法名
       /* u.updateUser();
       List<User> users= u.getUser();
       for(User user : users)
           System.out.println(user.getId()+"=="+user.getUsername()+"=="+user.getPassword());
        u.deleteUser();*/
    }
}

// maven jar 的下载： http://mvnrepository.com
//java 的集合有三种类型  ， List集合  Map集合（以键值的方式存储）  Set集合（以数组的方式进行存储）

// 把昨天的三个表
//进行增删改查 main 函数里面执行
// 设计系统表格，把表格的字段和英文名列出来 设置ER图